#pragma once

#include <QList>
#include <QHash>
#include "Expression.h"

class Expression;
class QShapeVersion;
class HistoryManager;

/* #TODO:
 * 1.其它操作的表达式适配
 * 2.表达式的关联性(改变1，若1与2有关联，则2也要同步修改)
 * 3.新建功能
 */

class ExpressionManager
{
public:
	ExpressionManager(HistoryManager* historyManager);
	// 为version增加表达式
	void AddExpression(QShapeVersion* shapeVersion);
	// 增加自定义表达式
	std::shared_ptr<Expression> AddCustomExpression();
	// 自定义表达式确定key
	void CustomExpressionConfirmKey(const std::shared_ptr<Expression>& expression);
	// 应用表达式
	void ApplyExpression(std::shared_ptr<Expression> expression);
	// 删除表达式
    void DeleteExpression(const std::shared_ptr<Expression>& expression);

	// 处于history stack的version才能进行表达式计算
	QList<std::shared_ptr<Expression>> GetValidExpressions();

	// 判断expression是否有效
	bool IsExpressionValid(const QString& expression, QList<std::shared_ptr<Feature>>& associatedFeatures);

	std::shared_ptr<Feature> GetFeature(const QString& key);
private:
	// 将version与其对应的表达式关联起来
	QHash<uint, QList<std::shared_ptr<Expression>>> versionToExpressions;
	// 不希望影响Feature的GC，所以用weak_ptr
	QHash<QString, std::weak_ptr<Feature>> features;

	QList<std::shared_ptr<Expression>> GenerateExpressions(QShapeVersion* shapeVersion);

	HistoryManager* m_historyManager;
};

